﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Javavaj.iHunter.Core;

namespace Javavaj.iHunter
{
    /// <summary>
    /// 用来表示一个频道对象
    /// </summary>
    public interface IChannel
    {
        /// <summary>
        /// 获取频道的标题
        /// </summary>
        string Title { get; }

        /// <summary>
        /// 频道的类别。为用斜杠('/')分割的字符串
        /// </summary>
        string Category { get; }

        /// <summary>
        /// 频道的原始页面链接
        /// </summary>
        string Link { get; }

        /// <summary>
        /// 频道的描述
        /// </summary>
        string Description { get; }

        /// <summary>
        /// 打开频道，建立到服务器的连接
        /// </summary>
        /// <returns>如果频道被成功打开，返回“真”(True)，否则返回“假”(False)</returns>
        bool Open();

        /// <summary>
        /// 关闭频道，释放对象所占有的资源
        /// </summary>
        void Close();

        /// <summary>
        /// 获得频道的HashCode
        /// </summary>  
        int GetHashCode();

        DateTime LastUpdateTime { get; set; }
      
        /// <summary>
        /// 返回指定日期范围内、指定类别的消息
        /// </summary>
        /// <param name="startTime">开始时间.</param>
        /// <param name="category">消息类别。如果category为null，则返回全部类别的消息</param>
        /// <param name="endTime">截止时间</param>
        /// <returns>如果没有指定范围的消息或类别无效，则返回一个空的ICollection(不是null)</returns>
        ICollection<IMessage> GetMessages(DateTime startTime, DateTime endTime, string category);

        /// <summary>
        /// 下载指定的附件,返回下载文件的数据流
        /// </summary>
        /// <param name="file">附件文件对象</param>
        Stream DownloadFile(IFileObject file);

        /// <summary>
        /// 刷新指定的消息
        /// </summary>
        /// <param name="message">更新的消息对象</param>
        /// <returns>消息是否更新</returns>
        bool RefreshMessage(IMessage message);

        /// <summary>
        /// 通知频道要对消息进行回复或提交文件，引发频道响应。
        /// 在接到通知后，一般情况下IChannel应该调用主程序给出的接口，让主程序帮助获得用户的回复信息。
        /// </summary>
        /// <param name="source">进行回复或提交文件的原消息。当source为null时，则为发布新的消息，此时频道应该弹出一个对话框，如果需要选择位置的话。</param>
        void NotifyReply(IMessage source);

        /// <summary>
        /// 主程序向频道传递用户对消息进行回复或提交文件的信息
        /// </summary>
        /// <param name="source"> 要回复的信息</param>
        /// <param name="replyinput">回复内容</param>
        /// <param name="tag">插件自定义标记</param>
        /// <remarks> 在这之前Channel已经调用了主程序的接口void GetReply(IMessage source, Pair[], string tag); 
        /// Pair.First是string，Pair.Second是enum EditItemType{ SingleLineText, FilePath }。
        /// tag会被原样返回。用来让频道知道发布的相关信息。</remarks>
        bool Reply(IMessage source, IDictionary<string, object> replyinput, string tag);

        event EditReplyEventHandler EditReply;
    }
}
